[PR]

水無瀬の部屋 > Programming > sample > goddess > instdlg.cpp
最終更新日: 2007/03/29

   1: //*********************************************************
   2: // プロジェクト: ああっ壁神さまっ
   3: //   ファイル名: instdlg.cpp
   4: //*********************************************************
   5: #include "instdlg.h"  //
   6: #include "install.h" //
   7: #include "res.h"     //
   8: #include <misc/atoffset.h>
   9: #include <header/myweburl.h>       //
  10: #include <dlg/aboutbox/aboutbox.h> //
  11: 
  12: 
  13: //---------------------------------------------------------
  14: // テスト関数 の 宣言
  15: //---------------------------------------------------------
  16: DECLARE_TESTPROC( test_InstallDlg );
  17: 
  18: 
  19: //---------------------------------------------------------
  20: // ファイルスコープ関数 の 宣言
  21: //---------------------------------------------------------
  22: static bool InitInstallDlgControls( HWND hWnd, DWORD more );
  23: static bool SetInstallDlgData( HWND hWnd, const install_t *info );
  24: static bool GetInstallDlgData( HWND hWnd, install_t *info );
  25: static bool EnableDlgItemGroup( HWND hWnd, id_t id, bool bEnable );
  26: static bool ShowDlgItemGroup( HWND hWnd, id_t id, bool bShow );
  27: static bool InitInstallDlgSystemMenu( HWND hWnd );
  28: static INT_PTR CALLBACK InstallDlgProc( HWND, UINT, WPARAM, LPARAM );
  29: 
  30: 
  31: //---------------------------------------------------------
  32: // ファイルスコープ変数 の 定義
  33: //---------------------------------------------------------
  34: //
  35: static struct g_dlg_tag
  36: 	{
  37: //		bool      ico;
  38: 		DWORD     more;
  39: 		RECT      rcClient;
  40: 		SIZE      szMinSize;
  41: 		install_t info;
  42: 	} g_dlg;
  43: 
  44: //
  45: static const struct g_ddx_tag
  46: 	{
  47: 		id_t  id;
  48: 		DWORD flag;
  49: 		int   check;
  50: 		int   more;
  51: //		int   reg;
  52: //		int   reg_title;
  53: 		int   menu;
  54: 		int   menu_title;
  55: 		int   cmdline;
  56: 		int   cmdline_title;
  57: 		int   group;
  58: 	}
  59: g_ddx[] = 
  60: 	{
  61: #define MAKE_DDX( name ) { ID_ ## name, INSTALL_ ## name, IDC_ ## name, IDC_MORE_ ## name, IDC_MENUTITLE_ ## name, IDC_STATIC_MENUTITLE_ ## name, IDC_CMDLINE_ ## name, IDC_STATIC_CMDLINE_ ## name, IDC_GROUP_ ## name }
  62: 		MAKE_DDX( CENTER ),
  63: 		MAKE_DDX( TILE ),
  64: 		MAKE_DDX( ZOOM ),
  65: #undef MAKE_DDX
  66: 	};
  67: COMPILE_ASSERT( numof(g_ddx) == numof( ((install_t *)null)->reg ) );
  68: 
  69: // 各コントロールIDへのアクセス
  70: static const size_t g_offset[] =
  71: 	{
  72: #define DDX_MEMBER_OFFSET( member ) offsetof( struct g_ddx_tag, member )
  73: 		DDX_MEMBER_OFFSET( check ), 
  74: 		DDX_MEMBER_OFFSET( more ),
  75: //		DDX_MEMBER_OFFSET( reg ),
  76: //		DDX_MEMBER_OFFSET( reg_title ),
  77: 		DDX_MEMBER_OFFSET( menu ),
  78: 		DDX_MEMBER_OFFSET( menu_title ),
  79: 		DDX_MEMBER_OFFSET( cmdline ),
  80: 		DDX_MEMBER_OFFSET( cmdline_title ),
  81: 		DDX_MEMBER_OFFSET( group ),
  82: #undef DDX_MEMBER_OFFSET
  83: 	};
  84: 
  85: 
  86: //*********************************************************
  87: // InstallDlg
  88: // アプリケーションを拡張子に関連づける
  89: //*********************************************************
  90: bool
  91: InstallDlg
  92: 	(
  93: 		HWND hwndOwner
  94: 	)
  95: {
  96: 	CALLONCE_TESTPROC( test_InstallDlg ); // [テスト]
  97: 
  98: 	// パラメタの仮定
  99: 	ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
 100: 
 101: 	HINSTANCE hInstance = GetModuleHandle( null );
 102: 	const INT_PTR result = DialogBoxParam
 103: 		(
 104: 			hInstance,
 105: 			MAKEINTRESOURCE( INSTALL_BOX ),
 106: 			hwndOwner, 
 107: 			InstallDlgProc,
 108: 			null
 109: 		);
 110: 	return IDOK == result;
 111: }//InstallDlg
 112: 
 113: 
 114: //******************************************************************************************************************
 115: //
 116: //******************************************************************************************************************
 117: static INT_PTR OnInstallInitDialog( HWND hWnd, WPARAM wParam, LPARAM lParam );
 118: static INT_PTR OnInstallDestroy( HWND hWnd );
 119: static INT_PTR OnInstallCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
 120: static INT_PTR OnInstallSystemCommand( HWND hWnd, WPARAM wParam, LPARAM lParam );
 121: static INT_PTR OnInstallHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
 122: static INT_PTR OnInstallGetMinMaxInfo( HWND hWnd, LPARAM lParam );
 123: static INT_PTR OnInstallSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
 124: 
 125: 
 126: //*********************************************************
 127: // InstallDlgProc
 128: //*********************************************************
 129: static
 130: INT_PTR
 131: CALLBACK
 132: InstallDlgProc
 133: 	(
 134: 		HWND   hWnd,
 135: 		UINT   uMsg,
 136: 		WPARAM wParam,
 137: 		LPARAM lParam
 138: 	)
 139: {
 140: 	// パラメタの仮定
 141: 	ASSERT( IsValidWindow( hWnd ) );
 142: 
 143: 	switch( uMsg )
 144: 	{
 145: 		case WM_DESTROY:       return OnInstallDestroy( hWnd );
 146: 		case WM_NCHITTEST:     return OnInstallHitTest( hWnd, wParam, lParam );
 147: 		case WM_INITDIALOG:    return OnInstallInitDialog( hWnd, wParam, lParam );
 148: 		case WM_COMMAND:       return OnInstallCommand( hWnd, wParam, lParam );
 149: 		case WM_SYSCOMMAND:    return OnInstallSystemCommand( hWnd, wParam, lParam );
 150: 		case WM_GETMINMAXINFO: return OnInstallGetMinMaxInfo( hWnd, lParam );
 151: 		case WM_SIZE:          return OnInstallSize( hWnd, wParam, lParam );
 152: 		default:               return false;
 153: 	}
 154: }//InstallDlgProc
 155: 
 156: //*********************************************************
 157: // OnInstallInitDialog - WM_INITDIALOG
 158: // ダイアログが作成された。
 159: // この関数が抜けるまでダイアログは表示されない。
 160: // 明示的にフォーカスを移動した場合は 真 を返せ。
 161: // さもなくば 偽 を返せ。
 162: //   HWND   wParam …… フォーカスを受け取る予定のコントロール
 163: //   LPARAM lParam …… ダイアログの初期化パラメタ
 164: //*********************************************************
 165: static
 166: INT_PTR
 167: OnInstallInitDialog
 168: 	(
 169: 		HWND   hWnd,
 170: 		WPARAM _unuse( wParam ),
 171: 		LPARAM _unuse( lParam )
 172: 	)
 173: {
 174: 	// パラメタの仮定
 175: 	ASSERT( IsValidWindow( hWnd ) );
 176: 	ASSERT( IsValidInitDialogMessageParam( wParam, lParam ) );
 177: 
 178: 	// ダイアログ の 初期化
 179: 	{
 180: 		HINSTANCE hInstance = GetModuleHandle( null );
 181: 		HICON hIcon   = SHGetInstanceIcon( hInstance, SHGFI_LARGEICON );
 182: 		HICON hIconSm = SHGetInstanceIcon( hInstance, SHGFI_SMALLICON );
 183: 		SetWindowIcon( hWnd, ICON_BIG,   hIcon   ); // 大きいアイコン
 184: 		SetWindowIcon( hWnd, ICON_SMALL, hIconSm ); // 小さいアイコン
 185: 		VERIFY( WindowMoveToCursorPos( hWnd ) );
 186: 
 187: 		// ダイアログ情報 g_dlg の 初期化
 188: 		{
 189: 			//
 190: 			VERIFY( GetClientRect( hWnd, &g_dlg.rcClient ) );
 191: 			VERIFY( GetWindowSize( hWnd, &g_dlg.szMinSize ) );
 192: 			
 193: 			//
 194: 			VERIFY( LoadInstallInfo( &g_dlg.info ) );
 195: 
 196: 			// 全ての詳細を隠す
 197: 			g_dlg.more = 0;
 198: 
 199: 			// 
 200: //			g_dlg.ico = (FLAG_TILE == (FLAG_TILE & g_dlg.info.flags)); 
 201: 		}
 202: 	}
 203: 
 204: 	// システムメニュー の 初期化
 205: 	VERIFY( InitInstallDlgSystemMenu( hWnd ) );
 206: 
 207: 	// コントロール の 初期化
 208: 	VERIFY( InitInstallDlgControls( hWnd, g_dlg.more ) );
 209: 
 210: 	// コントロール値 の 設定
 211: 	VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
 212: 
 213: 	return false;
 214: }//OnInstallInitDialog
 215: 
 216: //*********************************************************
 217: // OnInstallDestroy - WM_DESTROY
 218: // まもなくウィンドウが破棄される。
 219: // ウィンドウに関連付けた独自リソースを破棄する。
 220: // 常に 真 を返す。
 221: //*********************************************************
 222: static
 223: INT_PTR
 224: OnInstallDestroy
 225: 	(
 226: 		HWND _unuse( hWnd )
 227: 	)
 228: {
 229: 	// パラメタの仮定
 230: 	ASSERT( IsValidWindow( hWnd ) );
 231: 
 232: 	return true;
 233: }//OnInstallDestroy
 234: 
 235: //*********************************************************
 236: // OnInstallHitTest - WM_NCHITTEST
 237: // カーソル・イベントがあるたびに呼び出される。
 238: // カーソルが存在する位置を示す値を返す。
 239: //   GET_X_LPARAM( lParam ) …… カーソルのスクリーン x 座標
 240: //   GET_Y_LPARAM( lParam ) …… カーソルのスクリーン y 座標
 241: //*********************************************************
 242: static
 243: INT_PTR
 244: OnInstallHitTest
 245: 	(
 246: 		HWND   hWnd,
 247: 		WPARAM wParam, 
 248: 		LPARAM lParam
 249: 	)
 250: {
 251: 	// パラメタの仮定
 252: 	ASSERT( IsValidWindow( hWnd ) );
 253: 
 254: 	// サイズ変更矢印の変換ルール一覧
 255: 	const struct { LRESULT from; LRESULT to; } trans[] = 
 256: 		{
 257: 			{ HTCLIENT,      HTCAPTION }, // クライアント領域を掴んで移動可能に
 258: 			{ HTTOP,         HTBORDER  }, // 上端の縦矢印 → 矢印なし
 259: 			{ HTBOTTOM,      HTBORDER  }, // 下端の縦矢印 → 矢印なし
 260: 			{ HTTOPLEFT,     HTLEFT    }, // 左上隅の斜め矢印 → 左右矢印
 261: 			{ HTTOPRIGHT,    HTRIGHT   }, // 右上隅の斜め矢印 → 左右矢印
 262: 			{ HTBOTTOMLEFT,  HTLEFT    }, // 左下隅の斜め矢印 → 左右矢印
 263: 			{ HTBOTTOMRIGHT, HTRIGHT   }, // 右下隅の斜め矢印 → 左右矢印
 264: 		};
 265: 	// 変換一覧にあれば変換した値を返す
 266: 	const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
 267: 	{for( int i = 0; i < numof( trans ); ++i )
 268: 	{
 269: 		if ( lResult == trans[ i ].from )
 270: 		{
 271: 			SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
 272: 			return true;
 273: 		}
 274: 	}}
 275: 
 276: 	return false;
 277: }//OnInstallHitTest
 278: 
 279: //*********************************************************
 280: // OnInstallGetMinMaxInfo
 281: //*********************************************************
 282: static
 283: INT_PTR
 284: OnInstallGetMinMaxInfo
 285: 	(
 286: 		HWND   hWnd,
 287: 		LPARAM lParam
 288: 	)
 289: {
 290: 	// パラメタの仮定
 291: 	ASSERT( IsValidWindow( hWnd ) );
 292: 	ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
 293: 
 294: 	//
 295: 	MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
 296: 
 297: 	//
 298: 	pmmi->ptMinTrackSize.y = g_dlg.szMinSize.cy;
 299: 	pmmi->ptMaxTrackSize.y = g_dlg.szMinSize.cy;
 300: 
 301: 	//
 302: 	pmmi->ptMinTrackSize.x = ((0 != g_dlg.more) ? 2 : 1) * g_dlg.szMinSize.cx;
 303: 
 304: 	//
 305: 	if ( 0 == g_dlg.more )
 306: 	{
 307: 		pmmi->ptMaxTrackSize.x = g_dlg.szMinSize.cx;
 308: 	}
 309: 
 310: 	return true;
 311: }//OnInstallGetMinMaxInfo
 312: 
 313: //*********************************************************
 314: // OnInstallSize
 315: //*********************************************************
 316: static
 317: INT_PTR
 318: OnInstallSize
 319: 	(
 320: 		HWND   hWnd,
 321: 		WPARAM wParam,
 322: 		LPARAM lParam
 323: 	)
 324: {
 325: 	// パラメタの仮定
 326: 	ASSERT( IsValidWindow( hWnd ) );
 327: 
 328: 	// 最小化時は無視
 329: 	if ( SIZE_MINIMIZED == wParam )
 330: 		return true;
 331: 
 332: 	// 移動とサイズ変更のリスト
 333: 	const struct
 334: 		{
 335: 			int  nID;
 336: 			bool pos_x;
 337: 			bool pos_y;
 338: 			bool size_x;
 339: 			bool size_y;
 340: 		}
 341: 	ctrl[] =
 342: 		{
 343: //			{ IDC_CENTER,           false, false, false, false  },
 344: 			{ IDC_MORE_CENTER,      true,  false, false, false  },
 345: //			{ IDC_REGPATH_CENTER,   false, false, true,  false  },
 346: 			{ IDC_MENUTITLE_CENTER, false, false, true,  false  },
 347: 			{ IDC_CMDLINE_CENTER,   false, false, true,  false  },
 348: 			{ IDC_GROUP_CENTER,     false, false, true,  false  },
 349: 
 350: //			{ IDC_TILE,           false, false, false, false  },
 351: 			{ IDC_MORE_TILE,      true,  false, false, false  },
 352: //			{ IDC_REGPATH_TILE,   false, false, true,  false  },
 353: 			{ IDC_MENUTITLE_TILE, false, false, true,  false  },
 354: 			{ IDC_CMDLINE_TILE,   false, false, true,  false  },
 355: 			{ IDC_GROUP_TILE,     false, false, true,  false  },
 356: 			
 357: //			{ IDC_ZOOM,           false, false, false, false  },
 358: 			{ IDC_MORE_ZOOM,      true,  false, false, false  },
 359: //			{ IDC_REGPATH_ZOOM,   false, false, true,  false  },
 360: 			{ IDC_MENUTITLE_ZOOM, false, false, true,  false  },
 361: 			{ IDC_CMDLINE_ZOOM,   false, false, true,  false  },
 362: 			{ IDC_GROUP_ZOOM,     false, false, true,  false  },
 363: 
 364: 			{ IDOK,              true,  false, false, false  },
 365: 			{ IDCANCEL,          true,  false, false, false  }
 366: 		};
 367: 	HDWP hdwp = BeginDeferWindowPos( numof(ctrl) );
 368: 	if ( hdwp )
 369: 	{
 370: 		const int width   = LOWORD(lParam);
 371: 		const int height  = HIWORD(lParam);
 372: 		const int shift_x = width  - g_dlg.rcClient.right;
 373: 		const int shift_y = height - g_dlg.rcClient.bottom;
 374: 		{for( int i = 0; i < numof(ctrl); ++i )
 375: 		{
 376: 			ASSERT( IsValidDlgItem( hWnd, ctrl[ i ].nID ) );
 377: 			VERIFY( ShiftDeferDlgItem
 378: 				(
 379: 					&hdwp,
 380: 					hWnd,
 381: 					ctrl[i].nID,
 382: 					ctrl[i].pos_x  ? shift_x : 0,
 383: 					ctrl[i].pos_y  ? shift_y : 0,
 384: 					ctrl[i].size_x ? shift_x : 0,
 385: 					ctrl[i].size_y ? shift_y : 0
 386: 				) );
 387: 		}}
 388: 		VERIFY( EndDeferWindowPos( hdwp ) );
 389: 
 390: 		g_dlg.rcClient.right  = width;
 391: 		g_dlg.rcClient.bottom = height;
 392: 	}
 393: 	return true;
 394: }//OnInstallSize
 395: 
 396: 
 397: //******************************************************************************************************************
 398: // OnInstallCommand - WM_COMMAND
 399: //******************************************************************************************************************
 400: static INT_PTR OnInstallCommandOK( HWND hWnd );
 401: static INT_PTR OnInstallCommandCancel( HWND hWnd );
 402: static INT_PTR OnInstallCommandDefault( HWND hWnd, WPARAM wParam );
 403: static INT_PTR OnInstallCommandCheck( HWND hWnd, WPARAM wParam );
 404: static INT_PTR OnInstallCommandMore( HWND hWnd, WPARAM wParam );
 405: 
 406: 
 407: //*********************************************************
 408: // OnInstallCommand - WM_COMMAND
 409: // コマンド項目が選択された。
 410: // 返値の意味は要求されたコマンド項目による。
 411: //   LOWORD(wParam) …… 選択されたコマンド項目の識別子。
 412: //                     メニューの区切り線が選択された場合は 0 が設定される。
 413: //   HIWORD(wParam) …… 通知コード。
 414: //                     メッセージが  メニュー  から送信された場合は 0 が設定される。
 415: //                     メッセージがアクセラレータから送信された場合は 1 が設定される。
 416: //   HWND lParam    …… メッセージがコントロールから送信された場合はメッセージを送信したコントロールのハンドル。
 417: //
 418: //*********************************************************
 419: static
 420: INT_PTR
 421: OnInstallCommand
 422: 	(
 423: 		HWND   hWnd,
 424: 		WPARAM wParam,
 425: 		LPARAM _unuse( lParam )
 426: 	)
 427: {
 428: 	// パラメタの仮定
 429: 	ASSERT( IsValidWindow( hWnd ) );
 430: 	ASSERT( IsValidCommandMessageParam( wParam, lParam ) );
 431: 
 432: 	switch( LOWORD( wParam ) )
 433: 	{
 434: 		case IDOK:     return OnInstallCommandOK( hWnd );
 435: 		case IDCANCEL: return OnInstallCommandCancel( hWnd );
 436: 		default:       return OnInstallCommandDefault( hWnd, wParam );
 437: 	}
 438: }//OnInstallCommand
 439: 
 440: //*********************************************************
 441: // OnInstallCommandOK
 442: //*********************************************************
 443: static
 444: INT_PTR
 445: OnInstallCommandOK
 446: 	(
 447: 		HWND hWnd
 448: 	)
 449: {
 450: 	// パラメタの仮定
 451: 	ASSERT( IsValidWindow( hWnd ) );
 452: 
 453: 	//
 454: 	install_t info; // 設定値
 455: 	if ( ! GetInstallDlgData( hWnd, &info ) )
 456: 	{
 457: 		return false;
 458: 	}
 459: 	ASSERT( IsValidInstallInfo( &info ) );
 460: 
 461: 	// 関連づけ
 462: 	const DWORD modified = GetModifiedFlags( &info, &g_dlg.info );
 463: 	VERIFY( SaveInstallInfo( &info, modified ) );
 464: 
 465: 	//
 466: 	VERIFY( EndDialog( hWnd, IDOK ) );
 467: 
 468: 	return true;
 469: }//OnInstallCommandOK
 470: 
 471: //*********************************************************
 472: // OnInstallCommandCancel
 473: //*********************************************************
 474: static
 475: INT_PTR
 476: OnInstallCommandCancel
 477: 	(
 478: 		HWND hWnd
 479: 	)
 480: {
 481: 	// パラメタの仮定
 482: 	ASSERT( IsValidWindow( hWnd ) );	
 483: 	
 484: 	VERIFY( EndDialog( hWnd, IDCANCEL ) );
 485: 
 486: 	return true;
 487: }//OnInstallCommandCancel
 488: 
 489: //*********************************************************
 490: // OnInstallCommandDefault
 491: //*********************************************************
 492: static
 493: INT_PTR
 494: OnInstallCommandDefault
 495: 	(
 496: 		HWND   hWnd,
 497: 		WPARAM wParam
 498: 	)
 499: {
 500: 	// パラメタの仮定
 501: 	ASSERT( IsValidWindow( hWnd ) );
 502: 
 503: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 504: 	{
 505: 		const int id = LOWORD( wParam );
 506: 
 507: 		if ( id == g_ddx[ i ].check )
 508: 			return OnInstallCommandCheck( hWnd, wParam );
 509: 		if ( id == g_ddx[ i ].more )
 510: 			return OnInstallCommandMore( hWnd, wParam );
 511: 	}}
 512: 
 513: 	return false;
 514: }//OnInstallCommandDefault
 515: 
 516: //*********************************************************
 517: // OnInstallCommandCheck
 518: //*********************************************************
 519: static
 520: INT_PTR
 521: OnInstallCommandCheck
 522: 	(
 523: 		HWND   hWnd,
 524: 		WPARAM wParam
 525: 	)
 526: {
 527: 	// パラメタの仮定
 528: 	ASSERT( IsValidWindow( hWnd ) );
 529: 
 530: 	//
 531: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 532: 	{
 533: 		if ( g_ddx[ i ].check == LOWORD( wParam ) )
 534: 		{
 535: 			const bool bEnable = (BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ));
 536: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, bEnable );
 537: 			return true;
 538: 		}
 539: 	}}
 540: 
 541: 	UNREACHCODE( "g_ddx の抜け?" );
 542: 	return true;
 543: }//OnInstallCommandCheck
 544: 
 545: //*********************************************************
 546: // OnInstallCommandMore
 547: //*********************************************************
 548: static
 549: INT_PTR
 550: OnInstallCommandMore
 551: 	(
 552: 		HWND   hWnd,
 553: 		WPARAM wParam
 554: 	)
 555: {
 556: 	// パラメタの仮定
 557: 	ASSERT( IsValidWindow( hWnd ) );
 558: 
 559: 	//
 560: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 561: 	{
 562: 		if ( g_ddx[ i ].more == LOWORD( wParam ) )
 563: 		{
 564: 			g_dlg.more ^= g_ddx[ i ].flag;
 565: 			VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (g_dlg.more & g_ddx[ i ].flag) ) );
 566: 			return true;
 567: 		}
 568: 	}}
 569: 
 570: 	UNREACHCODE( "g_ddx の抜け?" );
 571: 	return true;
 572: }//OnInstallCommandMore
 573: 
 574: 
 575: //******************************************************************************************************************
 576: // WM_SYSCOMMAND
 577: //******************************************************************************************************************
 578: static INT_PTR OnInstallSystemCommandSetDefault( HWND hWnd );
 579: static INT_PTR OnInstallSystemCommandAbout( HWND hWnd );
 580: 
 581: 
 582: //*********************************************************
 583: // OnInstallSystemCommand - WM_SYSCOMMAND
 584: //*********************************************************
 585: static
 586: INT_PTR
 587: OnInstallSystemCommand
 588: 	(
 589: 		HWND   hWnd,
 590: 		WPARAM wParam,
 591: 		LPARAM _unuse( lParam )
 592: 	)
 593: {
 594: 	// パラメタの仮定
 595: 	ASSERT( IsValidWindow( hWnd ) );
 596: 	ASSERT( IsValidSystemCommandMessageParam( wParam, lParam ) );
 597: 
 598: 	switch( LOWORD(wParam) )
 599: 	{
 600: 		case IDM_ABOUT:      return OnInstallSystemCommandAbout( hWnd );
 601: 		case IDM_SETDEFAULT: return OnInstallSystemCommandSetDefault( hWnd );
 602: 		default:             return false;
 603: 	}
 604: }//OnInstallSystemCommand
 605: 
 606: //*********************************************************
 607: // OnInstallSystemCommandAbout
 608: //*********************************************************
 609: static
 610: INT_PTR
 611: OnInstallSystemCommandAbout
 612: 	(
 613: 		HWND hWnd
 614: 	)
 615: {
 616: 	// パラメタの仮定
 617: 	ASSERT( IsValidWindow( hWnd ) );
 618: 
 619: 	ABOUTBOX_t tmp; // AboutBox のパラメータ
 620: 	tmp.url = URL_WEBPAGE;
 621: 	AboutBox( hWnd, &tmp ); // 「……について」ダイアログを表示する。
 622: 
 623: 	return true;
 624: }//OnInstallSystemCommandAbout
 625: 
 626: //*********************************************************
 627: // OnInstallSystemCommandSetDefault
 628: //*********************************************************
 629: static
 630: INT_PTR
 631: OnInstallSystemCommandSetDefault
 632: 	(
 633: 		HWND hWnd
 634: 	)
 635: {
 636: 	// パラメタの仮定
 637: 	ASSERT( IsValidWindow( hWnd ) );
 638: 
 639: 	VERIFY( SetInstallDlgData( hWnd, &g_dlg.info ) );
 640: /*
 641: 	//
 642: 	g_dlg.ico = (FLAG_TILE == (FLAG_TILE & g_dlg.info.flags)); 
 643: 
 644: 	// OnInstallSystemCommandUsePif(), InitInstallDlgControls() と重複している!
 645: 	// 関数名を考えよう!
 646: 	if ( g_dlg.ico )
 647: 	{
 648: 		VisibleDlgItem( hWnd, IDC_TILE,      true );
 649: 		VisibleDlgItem( hWnd, IDC_MORE_TILE, true );
 650: 	}
 651: 	else
 652: 	{
 653: 		VisibleDlgItem( hWnd, IDC_TILE,      false );
 654: 		VisibleDlgItem( hWnd, IDC_MORE_TILE, false );
 655: 
 656: 		if ( FLAG_TILE == (g_dlg.more & FLAG_TILE) )
 657: 		{
 658: 			g_dlg.more ^= FLAG_TILE;
 659: 			VERIFY( ShowDlgItemGroup( hWnd, ID_TILE, FLAG_TILE == (FLAG_TILE & g_dlg.more) ) );
 660: 		}
 661: 	}
 662: */
 663: 
 664: 	return true;
 665: }//OnInstallSystemCommandSetDefault
 666: 
 667: 
 668: //******************************************************************************************************************
 669: // private - init
 670: //******************************************************************************************************************
 671: //*********************************************************
 672: // InitInstallDlgSystemMenu
 673: //*********************************************************
 674: static
 675: bool
 676: InitInstallDlgSystemMenu
 677: 	(
 678: 		HWND hWnd
 679: 	)
 680: {
 681: 	// パラメタの仮定
 682: 	ASSERT( IsValidWindow( hWnd ) );
 683: 
 684: 	HMENU hmenuSystem = GetSystemMenu( hWnd, false );
 685: 	const int pos = GetMenuItemPos( hmenuSystem, SC_ZOOM );
 686: 	if ( 0 <= pos )
 687: 	{
 688: 		const struct 
 689: 			{
 690: 					  UINT  type;
 691: 					  UINT  id;
 692: 				const char *title;
 693: 			}
 694: 		item[] =
 695: 			{
 696: #define MAKE_MENUITEM( type, id, title ) { type, id, title }
 697: 				MAKE_MENUITEM( MF_SEPARATOR, 0,              null ),
 698: 				MAKE_MENUITEM( MF_STRING,    IDM_SETDEFAULT, "設定を初期値に戻す(&D)" ),
 699: 				MAKE_MENUITEM( MF_STRING,    IDM_ABOUT,      "About(&A)" ),
 700: #undef MAKE_MENUITEM
 701: 			};
 702: 		{for( int i = numof( item ); 0 < i; --i )
 703: 		{
 704: 			VERIFY( InsertMenu( hmenuSystem, pos+1, MF_BYPOSITION | item[ i-1 ].type, item[ i-1 ].id, item[ i-1 ].title ) );
 705: 	//		Menu_InsertSeparator( hmenuSystem, pos+1, MF_BYPOSITION );
 706: 		}}
 707: 	}
 708: 
 709: 	return true;
 710: }//InitInstallDlgSystemMenu
 711: 
 712: 
 713: //******************************************************************************************************************
 714: // private
 715: //******************************************************************************************************************
 716: static bool SetInstallDlgDataVerbList( HWND hwndListView, const char *verb );
 717: 
 718: 
 719: //*********************************************************
 720: // ShowDlgItemGroup
 721: //*********************************************************
 722: static
 723: bool
 724: ShowDlgItemGroup
 725: 	(
 726: 		HWND hWnd,
 727: 		id_t id,
 728: 		bool bShow
 729: 	)
 730: {
 731: 	// パラメタの仮定
 732: 	ASSERT( IsValidWindow( hWnd ) );
 733: 	ASSERT( IS_VALID_ID( id ) );
 734: 
 735: 	{for( int index = 0; index < numof( g_ddx ); ++index )
 736: 	{
 737: 		if ( id == g_ddx[ index ].id )
 738: 		{
 739: 			//
 740: 			SetDlgItemText( hWnd, g_ddx[ index ].more, bShow ? "<< 詳細" : "詳細 >>" );
 741: 
 742: 			//
 743: 			{for( int i = 0; i < numof( g_offset ); ++i )
 744: 			{
 745: 				const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
 746: 				if ( (ctrl != g_ddx[ index ].check )
 747: 				  && (ctrl != g_ddx[ index ].more) )
 748: 				{
 749: 					if ( IsValidDlgItem( hWnd, ctrl ) )
 750: 					{
 751: 						VisibleDlgItem( hWnd, ctrl, bShow );
 752: 					}
 753: 				}
 754: 			}}
 755: 
 756: 			//
 757: 			const int sign = bShow ? 1 : -1;
 758: 			const int group_bottom = GetDlgItemBottom( hWnd, g_ddx[ index ].group );
 759: 			const int more_bottom  = GetDlgItemBottom( hWnd, g_ddx[ index ].more );
 760: 			const int height = sign * (group_bottom - more_bottom);
 761: 
 762: 			//
 763: 			{for( int i = 0; i < numof( g_ddx ); ++i )
 764: 			{
 765: 				if ( i != index )
 766: 				{
 767: 					if ( more_bottom < GetDlgItemTop( hWnd, g_ddx[ i ].group ) )
 768: 					{
 769: 						{for( int j = 0; j < numof( g_offset ); ++j )
 770: 						{
 771: 							const int ctrl = atoffset( int, &g_ddx[ i ], g_offset[ j ] );
 772: 							if ( IsValidDlgItem( hWnd, ctrl ) )
 773: 							{
 774: 								ShiftDlgItemPos( hWnd, ctrl, 0, height );
 775: 							}
 776: 						}}
 777: 					}
 778: 				}
 779: 			}}
 780: 
 781: 			//
 782: 			ShiftDlgItemPos( hWnd, IDOK,     0, height );
 783: 			ShiftDlgItemPos( hWnd, IDCANCEL, 0, height );
 784: 
 785: 			//
 786: 			g_dlg.szMinSize.cy += height;
 787: 			ShiftWindowSize( hWnd, 0, height );
 788: 		}
 789: 	}}
 790: 
 791: 	return true;
 792: }//ShowDlgItemGroup
 793: 
 794: //*********************************************************
 795: // EnableDlgItemGroup
 796: //*********************************************************
 797: static
 798: bool
 799: EnableDlgItemGroup
 800: 	(
 801: 		HWND hWnd,
 802: 		id_t id,
 803: 		bool bEnable
 804: 	)
 805: {
 806: 	// パラメタの仮定
 807: 	ASSERT( IsValidWindow( hWnd ) );
 808: 	ASSERT( IS_VALID_ID( id ) );
 809: 
 810: 	//
 811: 	{for( int index = 0; index < numof( g_ddx ); ++index )
 812: 	{
 813: 		if ( id == g_ddx[ index ].id )
 814: 		{
 815: 			{for( int i = 0; i < numof( g_offset ); ++i )
 816: 			{
 817: 				const int ctrl = atoffset( int, &g_ddx[ index ], g_offset[ i ] );
 818: 				if ( (ctrl != g_ddx[ index ].check )
 819: 				  && (ctrl != g_ddx[ index ].more) )
 820: 				{
 821: 					if ( IsValidDlgItem( hWnd, ctrl ) )
 822: 					{
 823: 						EnableDlgItem( hWnd, ctrl, bEnable );
 824: 					}
 825: 				}
 826: 			}}
 827: 		}
 828: 	}}
 829: 
 830: 	return true;
 831: }//EnableDlgItemGroup
 832: 
 833: //*********************************************************
 834: // GetInstallDlgData
 835: //*********************************************************
 836: static
 837: bool
 838: GetInstallDlgData
 839: 	(
 840: 		HWND       hWnd,
 841: 		install_t *info
 842: 	)
 843: {
 844: 	// パラメタの仮定
 845: 	ASSERT( IsValidWindow( hWnd ) );
 846: 	ASSERT( IsValidPtr( info, sizeof( *info ) ) );
 847: 	DESTROY_BUFFER( info, sizeof( *info ) ); // [破壊]
 848: 
 849: 	// 関連づけ
 850: 	info->flags = 0;
 851: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 852: 	{
 853: 		// check
 854: 		if ( IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
 855: 		{
 856: 			if ( BST_CHECKED == IsDlgButtonChecked( hWnd, g_ddx[ i ].check ) )
 857: 			{
 858: 				info->flags |= g_ddx[ i ].flag;
 859: 			}
 860: 		}
 861: 		
 862: 		//
 863: 		{
 864: 			ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
 865: 			const size_t index = ID_INDEX( g_ddx[ i ].id );
 866: 			ASSERT( IS_VALID_INDEX( index ) );
 867: 			relation_t *reg = &info->reg[ index ];
 868: 
 869: 			// default
 870: 			strcopy( reg->menu, numof(reg->menu), g_dlg.info.reg[ index ].menu );
 871: 			strcopy( reg->cmdline, numof(reg->cmdline), g_dlg.info.reg[ index ].cmdline );
 872: 			strcopy( reg->regpath, numof(reg->regpath), g_dlg.info.reg[ index ].regpath );
 873: 
 874: 			// regpath
 875: /*			if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
 876: 			{
 877: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath, numof( reg->regpath ) ) );
 878: 			}
 879: //			ASSERT( IsValidRegistryPathString( reg->regpath ) );*/
 880: 
 881: 			// menu
 882: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
 883: 			{
 884: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu, numof( reg->menu ) ) );
 885: 			}
 886: 			ASSERT( IsValidStringPtr( reg->menu ) );
 887: 
 888: 			// cmdline
 889: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
 890: 			{
 891: 				VERIFY( 0 <= GetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline, numof( reg->cmdline ) ) );
 892: 			}
 893: 			ASSERT( IsValidCommandLineString( reg->cmdline ) );
 894: 		}
 895: 	}}
 896: 
 897: 	
 898: 	ASSERT( IsValidInstallInfo( info ) );
 899: 	return true;
 900: }//GetInstallDlgData
 901: 
 902: //*********************************************************
 903: // SetInstallDlgData
 904: //*********************************************************
 905: static
 906: bool
 907: SetInstallDlgData
 908: 	(
 909: 		      HWND       hWnd,
 910: 		const install_t *info
 911: 	)
 912: {
 913: 	// パラメタの仮定
 914: 	ASSERT( IsValidWindow( hWnd ) );
 915: 	ASSERT( IsValidInstallInfo( info ) );
 916: 
 917: 	// 
 918: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 919: 	{
 920: 		// check
 921: 		const UINT uCheck = (g_ddx[ i ].flag == (info->flags & g_ddx[ i ].flag)) ? BST_CHECKED : BST_UNCHECKED;
 922: 		if ( ! IsValidDlgItem( hWnd, g_ddx[ i ].check ) )
 923: 		{
 924: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, false );
 925: 		}
 926: 		else
 927: 		{
 928: 			EnableDlgItemGroup( hWnd, g_ddx[ i ].id, BST_CHECKED == uCheck );
 929: 			CheckDlgButton( hWnd, g_ddx[ i ].check, uCheck );
 930: 		}
 931: 
 932: 		//
 933: 		{
 934: 			ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
 935: 			const size_t index = ID_INDEX( g_ddx[ i ].id );
 936: 			ASSERT( IS_VALID_INDEX( index ) );
 937: 			const relation_t *reg = &info->reg[ index ];
 938: //			ASSERT( IsValidRegistryPathString( reg->regpath ) );
 939: 			ASSERT( IsValidCommandLineString( reg->cmdline ) );
 940: 			ASSERT( IsValidStringPtr( reg->menu ) );
 941: 
 942: 			// regpath
 943: /*			if ( IsValidDlgItem( hWnd, g_ddx[ i ].reg ) )
 944: 			{
 945: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].reg, reg->regpath ) );
 946: 			}*/
 947: 
 948: 			// menu
 949: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].menu ) )
 950: 			{
 951: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].menu, reg->menu ) );
 952: 			}
 953: 
 954: 			// cmdline
 955: 			if ( IsValidDlgItem( hWnd, g_ddx[ i ].cmdline ) )
 956: 			{
 957: 				VERIFY( SetDlgItemText( hWnd, g_ddx[ i ].cmdline, reg->cmdline ) );
 958: 			}
 959: 		}
 960: 	}}
 961: 
 962: 	return true;
 963: }//SetInstallDlgData
 964: 
 965: 
 966: //******************************************************************************************************************
 967: // private - init controls
 968: //******************************************************************************************************************
 969: //*********************************************************
 970: // InitInstallDlgControls
 971: //*********************************************************
 972: static
 973: bool
 974: InitInstallDlgControls
 975: 	(
 976: 		HWND  hWnd,
 977: 		DWORD more
 978: 	)
 979: {
 980: 	// パラメタの仮定
 981: 	ASSERT( IsValidWindow( hWnd ) );
 982: 
 983: 	//
 984: 	{for( int i = 0; i < numof( g_ddx ); ++i )
 985: 	{
 986: 		VERIFY( VisibleDlgItem( hWnd, g_ddx[ i ].more, false ) );
 987: 		VERIFY( ShowDlgItemGroup( hWnd, g_ddx[ i ].id, 0 != (more & g_ddx[ i ].flag) ) );
 988: 	}}
 989: /*
 990: 	// OnInstallSystemCommandUsePif(), OnInstallSystemCommandSetDefault() と重複している!
 991: 	// 関数名を考えよう!
 992: 	if ( g_dlg.ico )
 993: 	{
 994: 		VisibleDlgItem( hWnd, IDC_TILE,      true );
 995: 		VisibleDlgItem( hWnd, IDC_MORE_TILE, true );
 996: 	}
 997: 	else
 998: 	{
 999: 		VisibleDlgItem( hWnd, IDC_TILE,      false );
1000: 		VisibleDlgItem( hWnd, IDC_MORE_TILE, false );
1001: 
1002: 		if ( FLAG_TILE == (g_dlg.more & FLAG_TILE) )
1003: 		{
1004: 			g_dlg.more ^= FLAG_TILE;
1005: 			VERIFY( ShowDlgItemGroup( hWnd, ID_TILE, FLAG_TILE == (FLAG_TILE & g_dlg.more) ) );
1006: 		}
1007: 	}
1008: */
1009: 
1010: 	return true;
1011: }//InitInstallDlgControls
1012: 
1013: 
1014: 
1015: //******************************************************************************************************************
1016: // TEST
1017: //******************************************************************************************************************
1018: 
1019: 
1020: #ifdef _DEBUG // デバッグ時のみ
1021: 
1022: 
1023: //*********************************************************
1024: // test_InstallDlg
1025: //*********************************************************
1026: DEFINE_TESTPROC( test_InstallDlg )
1027: {
1028: 	//---------------------------------------------------------
1029: 	// 定数 の テスト
1030: 	//---------------------------------------------------------
1031: 
1032: 	// g_offset の 重複
1033: 	{for( int i = 0; i < numof( g_offset ) - 1; ++i )
1034: 	{
1035: 		{for( int j = i+1; j < numof( g_offset ); ++j )
1036: 		{
1037: 			ASSERT( i != j );
1038: 			ASSERT( g_offset[ i ] != g_offset[ j ] );
1039: 		}}
1040: 	}}
1041: 
1042: 	// g_ddx の 範囲
1043: 	{for( int i = 0; i < numof( g_ddx ); ++i )
1044: 	{
1045: 		ASSERT( IS_VALID_ID( g_ddx[ i ].id ) );
1046: //		ASSERT( (0 <= g_ddx[i].id) && (g_ddx[i].id < numof( ((install_t *)null)->reg )) );
1047: 	}}
1048: 
1049: 	// g_ddx の 重複
1050: 	{for( int i = 0; i < numof( g_ddx ) - 1; ++i )
1051: 	{
1052: 		{for( int j = i+1; j < numof( g_ddx ); ++j )
1053: 		{
1054: 			ASSERT( i != j );
1055: 			ASSERT( g_ddx[ i ].id != g_ddx[ j ].id );
1056: 			ASSERT( 0 == (g_ddx[ i ].flag & g_ddx[ j ].flag) );
1057: 
1058: 			{for( int k = 0; k < numof( g_offset ); ++k )
1059: 			{
1060: 				const int ctrl_i = atoffset( int, &g_ddx[ i ], g_offset[ k ] );
1061: 				const int ctrl_j = atoffset( int, &g_ddx[ j ], g_offset[ k ] );
1062: 				ASSERT( ctrl_i != ctrl_j );
1063: 			}}
1064: 		}}
1065: 	}}
1066: 
1067: 
1068: 	//---------------------------------------------------------
1069: 	// ファイルスコープ関数 の テスト
1070: 	//---------------------------------------------------------
1071: 
1072: 	//---------------------------------------------------------
1073: 	// 公開関数 の テスト
1074: 	//---------------------------------------------------------
1075: 
1076: }//test_InstallDlg
1077: 
1078: 
1079: #endif // #ifdef _DEBUG
1080: 
1081: 
1082: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > goddess > instdlg.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/goddess/instdlg_cpp.shtml
同人ダウンロード販売
同人ダウンロード販売|DL.Getchu.com